package datastructure;

import java.util.Arrays;

/**
 * Created with IntelliJ IDEA.
 * Description:
 *
 * @author lzy
 * @create 2019-11-07 下午2:12
 */
public class StackSort {
    /**
     * 下沉调整
     *
     * @param array
     * @param parentIndex
     * @param length
     */
    public static void downAdjust(int[] array, int parentIndex, int length) {
        // temp保存父节点值，用于最后的赋值
        int temp = array[parentIndex];
        int childIndex = 2 * parentIndex + 1;
        while (childIndex < length) {
            //　如果有右孩子，且右孩子的值大于左孩子的值，则定位到右孩子
            if (childIndex + 1 < length && array[childIndex] < array[childIndex + 1]) {
                childIndex++;
            }
            // 如果父节点的值大于任何一个子节点的值，则直接跳出
            if (temp > array[childIndex]) {
                break;
            }
            //不用实际交换，直接单向赋值即可
            array[parentIndex] = array[childIndex];
            parentIndex = childIndex;
            childIndex = 2 * parentIndex + 1;
        }

        array[parentIndex] = temp;
    }

    /**
     * 堆排序（升序）
     *
     * @param array
     */
    public static void heapSort(int[] array) {
        //1.把无序数组构建成最大堆
        for (int i = array.length / 2 - 1; i >= 0; i--) {
            downAdjust(array, i, array.length);
        }
        System.out.println(Arrays.toString(array));

        //2.循环删除堆顶元素，移到集合尾部，调整堆产生新的堆顶
        for (int i = array.length - 1; i > 0; i--) {
            //最后一个元素和第１个元素进行交换
            int temp = array[i];
            array[i] = array[0];
            array[0] = temp;
            // 3.下沉调整最大堆
            downAdjust(array, 0, i);
        }
    }

    public static void main(String[] args) {
        int[] arr = {1, 3, 2, 6, 5, 7, 8, 9, 10, 0};
        heapSort(arr);
        System.out.println(Arrays.toString(arr));
    }
}
